package cn.com.nes.site.controller.project;

import cn.com.nes.common.util.ExcelUtils;
import cn.com.nes.site.entity.PageData;
import cn.com.nes.site.entity.iot.CascadeCell;
import cn.com.nes.site.entity.iot.CustomerSurveyExcel;
import cn.com.nes.site.entity.vo.crm.ExportArchivesTemplateVO;
import cn.com.nes.site.entity.vo.project.ImportGovernmentalCustomerArchiveVO;
import cn.com.nes.site.handle.CascadeWriteHandler;
import cn.com.nes.site.listener.ExcelListener;
import cn.com.nes.site.service.logs.ImportLogsService;
import cn.com.nes.site.service.project.GovernmentalProjectManageService;
import cn.com.nes.site.service.system.excel.GovernmentalCustomerArchivesConsumer;
import cn.com.nes.site.service.system.region.XzqhService;
import cn.com.nes.site.service.system.region.dto.XzqhDTO;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 政府项目管理控制层
 *
 * @Author: ShenWei
 * @Date: 2024/05/17/10:58
 */
@Slf4j
@Controller
@RequestMapping("/v2/project/governmental")
public class GovernmentalProjectManageController {

    @Resource
    private GovernmentalCustomerArchivesConsumer consumer;

    @Resource
    private GovernmentalProjectManageService governmentalProjectManageService;

    @Resource
    private XzqhService xzqhService;

    @Resource
    ImportLogsService importLogsService;
    /**
     * 导入政府项目客户档案
     * 导入校验规则，如果身份证号一样，只添加一条，其余都是更新操作
     * 如果身份证号为空( 校验其他项 )
     * 如果手机号为空,就不导入数据
     * 如果身份证号为空、行政区划、手机号、户主名称都一样，也只添加一条，其余都是更新操作
     * 如果身份证号为空、行政区划、手机号一样，但是名字不一样,新增一条
     * 如果身份证号为空、行政区划、名字一样，手机号不一样，新增一条
     * 如果身份证号为空、行政区划和手机号，都一样，没有户主名称，没有身份证号，也是更新操作
     * 如果身份证号为空、行政区划不一样，手机号和户主名字一样,也是新增一条数据
     * 如果身份证号不为空,行政区划、手机号、户主名称都一样，身份证好不一样，也是新增一条数据
     */
    @RequestMapping(value = "/importCustomerInfo", method = RequestMethod.POST)
    @ResponseBody
    public PageData importCustomerInfo(@RequestParam("file") MultipartFile file, @Validated ImportGovernmentalCustomerArchiveVO vo) throws Exception {
        try {
            InputStream inputStream = file.getInputStream();
            if (ObjectUtil.isNull(inputStream)) {
                return PageData.error("请选择导入文件");
            }
            // 保存大客户信息
           String mainBusinessId=governmentalProjectManageService.saveMasterCustomerInfo(vo);
            vo.setMainBusinessId(mainBusinessId);
            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    ExcelListener<CustomerSurveyExcel> listener = new ExcelListener<>(vo, consumer,importLogsService);
                    listener.setRemoveStart(2); // 前两行数据不参与导入
                    try {
                        ExcelUtils.importExcel(inputStream, CustomerSurveyExcel.class, 0, listener);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            thread.start();
        } catch (IOException e) {
            return PageData.error("导入失败!" + e.getMessage());
        }
        return PageData.ok();
    }

    /**
     * 下载政府项目客户导入模板
     */
    @RequestMapping(value = "/exportTemplate", method = RequestMethod.POST)
    @ResponseBody
    public PageData exportTemplate(@RequestBody @Validated ExportArchivesTemplateVO vo, HttpServletResponse response) throws Exception {
        log.info("exportTemplate start...");
        try {
            // 获取下拉框内容
            List<CascadeCell> cascadeCellList = governmentalProjectManageService.getExportInfo(vo);
            // 自定义级联下拉框处理器
            SheetWriteHandler sheetWriteHandler = new CascadeWriteHandler(cascadeCellList);
            ;
            List<XzqhDTO> xzqhDTOList = xzqhService.getXzqhListByXzqhdmList(vo.getXzqhdmList());
            XzqhDTO xzqhDTO= xzqhDTOList.get(0);
            // 输出文件
            ExcelUtils.exportExcel(getHeader(), sheetWriteHandler, response, "导入信息", xzqhDTO.getXzqhmc()+"客户档案导入模板");

        } catch (Exception e) {
            log.error("下载导入模板失败,失败原因:{}", e.getMessage());
            return PageData.error("下载导入模板失败!");
        }
        log.info("exportTemplate success!");
        return PageData.ok();
    }

    // 设置Excel基础标头
    public List<List<String>> getHeader() {
        String headerNameStr_1 = "供热改造工程摸底排查表";
        String headerNameStr_2 = "行政区划,地址,门牌号,户主姓名,身份证号码,电话号码,房屋面积,建筑结构,房屋类型,采暖末端,计划年度,能源类型,供暖方式,设备型号,是否本村户籍,备注";

        List<List<String>> header = new ArrayList<>();
        String[] headerNameList = headerNameStr_2.split(",");
        for (String headerName : headerNameList) {
            header.add(Arrays.asList(headerNameStr_1, headerName));
        }
        return header;
    }
}
